Fuzzing is a software testing technique for finding bugs. We might be able to use the bugs we’ve found as exploits.
We run the program many times on abnormal/malformed inputs, looking for unintended behaviour.
We need to be able to measure side effects.
We mutate seed inputs to create new test inputs - simply strategy is to randomly choose an offset and change the byte.
Blackbox - Only the interface is known. Whitebox - Application itself can be analysed/monitored
Rather than throwing inputs, evolve them. We start with an input, mutate it, execute and monitor edge cases. If it produces an edge case, add it to our list of inputs, otherwise, mutate it further. Usually code coverage is used as the metric to evaluate the effectiveness of mutation.
Not a very explored field. Uses methods to determine which direction the fuzzing should go in based on heuristics such as how much of an impact evolution in that direction is having.